//  class User {
//      //ts中不可以创建新的属性，默认在类创建时间，属性就应该是有的,直接在属性列表，直接在属性列表里面，编译结果中是不存在的
//      name:string
//      age:string
//      constructor(name:string, age:string) {
//         this.name = name
//         this.age = age
//      }
//  }

//  const n = new User("AAA",'222');  //不可以给n手动创建属性    u.sex = 'nv'  报错

 
// class User {
//     name:string
//     age:string
//     constructor(name:string, age:string) {
//        this.name = name
//        this.age = age
//     }
// }


// //没有给age初始化赋值，默认age为undefined，防止这个问题的出现，需要配置  "strictPropertyInitialization":true, 不给初始化赋值就会报错
// const n = new User("AAA",'222');  //不可以给n手动创建属性    u.sex = '女'  报错





// ----------------------------》//属性的初始化位置：《-------------------------
//     //构造函数中
//     //属性默认值
// enum Gender {
//     male = "男",
//     famale = "女"
// }

// // class User {
// //     name:string
// //     age:string
// //     gender:Gender
// //     constructor(name:string, age:string, gender:Gender = Gender.male) {
// //        this.name = name
// //        this.age = age
// //        this.gender = gender
// //     }
// // }


// // 属性默认值
// // const n = new User("AAA",'222',Gender.famale); 


// class User {
//     name:string
//     age:string
//     gender:Gender = Gender.male
//     constructor(name:string, age:string ) {
//        this.name = name
//        this.age = age
//     }
// }


// //默认值
// const n = new User("AAA",'222'); 
// n.gender = Gender.famale




//-----------------------》可选择属性，不会有初始化的要求《------------
    // enum Gender {
    //     male = "男",
    //     famale = "女"
    // }
    // class User {
    //     name:string
    //     age:string
    //     gender:Gender = Gender.male
    //     // pid:string | null = null //可以没有的
    //     pid?:string 
    //     constructor(name:string, age:string ) {
    //        this.name = name
    //        this.age = age
    //     }
    // }
    
    
    // //默认值
    // const n = new User("AAA",'222'); 
    // n.gender = Gender.famale
    
//------------------------》有些属性一旦初始化，就不可以改变《------------------

        // enum Gender {
        //     male = "男",
        //     famale = "女"
        // }
        // class User {

        //     readonly id:number  //只能读，不能修改
        //     name:string
        //     age:string
        //     gender:Gender = Gender.male
        //     pid?:string 
        //     constructor(name:string, age:string ) {
        //     this.id = Math.random() * 10
        //     this.name = name
        //     this.age = age
        //     }
        // }

        // const n = new User("AAA",'222'); 
        // n.gender = Gender.famale

//属性系统内部可以读取，但是外部不可以读取的 -----------------》访问修饰符：访问修饰符可以控制类中的某一个成员的访问权限
       //有三个：publick：在类的里面和外面都可以访问
       //       private：私有属性，只有在类中可以访问
       //      protected 
        // enum Gender {
        //     male = "男",
        //     famale = "女"
        // }
        // class User {
        //     private publishNumber:number = 3  //每天一共可以发布多少篇文章
        //     private curNumber:number = 0     //已经发布多少篇文章
        //     readonly id:number  //只能读，不能修改
        //     name:string
        //     age:string
        //     gender:Gender = Gender.male
        //     pid?:string 
        //     constructor(name:string, age:string ) {
        //         this.id = Math.random() * 10
        //         this.name = name
        //         this.age = age
        //     }
        //     publish(title:string) {
        //         if(this.publishNumber > this.curNumber) {
        //             console.log('发布文章')
        //             this.curNumber ++
        //         } else {
        //             console.log('超标了')
        //         }
        //     }
        // }

        // const n = new User("AAA",'222'); 
        
        // n.publish('12e31234')
        // n.publish('12e31234')
        // n.publish('12e31234')
        // n.publish('12e31234')
        // n.publish('12e31234')
        // n.publish('12e31234')
        // //n.curNumber = 2333    不可以改变


        //------------------------------------------语法糖---------------------------------
        //如果某个属性，通过构造函数的参数传递，并且不做任何处理的赋值给该属性，可以进行简写
        // enum Gender {
        //     male = "男",
        //     famale = "女"
        // }
        // class User {
        //     private publishNumber:number = 3  //每天一共可以发布多少篇文章
        //     private curNumber:number = 0     //已经发布多少篇文章
        //     readonly id:number  //只能读，不能修改
        //     // name:string
        //     // age:string
        //     gender:Gender = Gender.male
        //     pid?:string 
        //     constructor(public name:string, public age:string ) {
        //         this.id = Math.random() * 10
        //         // this.name = name
        //         // this.age = age
        //     }
        //     publish(title:string) {
        //         if(this.publishNumber > this.curNumber) {
        //             console.log('发布文章')
        //             this.curNumber ++
        //         } else {
        //             console.log('超标了')
        //         }
        //     }
        // }


// ---------------------------》访问器 《 ---------------------
//访问器：控制js属性的的读取

enum Gender {
    male = "男",
    famale = "女"
}
class User {
    private _publishNumber:number = 3 
    private _curNumber:number = 0    
    readonly id:number  
    gender:Gender = Gender.male
    pid?:string 
    constructor(public name:string, private _age:number ) {
        this.id = Math.random() * 10
    }
    publish(title:string) {
        if(this._publishNumber > this._curNumber) {
            console.log('发布文章')
            this._curNumber ++
        } else {
            console.log('超标了')
        }
    }
    //设置器
    set age(age:number) {
       if(age < 0) {
         this._age = 0
       } else if(age > 200) {
         this._age = 200
       } else {
         this._age = Math.floor(age)
       }
    }
    //读取器
    get age() {
       return this._age
    }
}

let u = new User('aaa', 22)
//年龄不能为小数，赋值和取值需要进行控制
u.age = 20
console.log(u.age)

